package IO;

import java.io.*;


/**
 * 目录的复制
 * 源文件路径必须存在，目标目录李静不存在，但是有父目录
 */
public class directoryCopy {
    //源目录路径
   static File sourceFile=new File("D:\\桌面文件\\java课程\\课程资料\\javaweb\\哈哈哈哈");
    //目标目录路径
   static File targetFile=new File("D:\\桌面文件\\java课程\\课程资料\\javaweb\\哈哈哈哈\\文件1\\文件2");

    public static void main(String[] args) throws Exception {

        traversal(sourceFile);
    }

    private static void traversal(File sourceFile) throws Exception{

        File[] files=sourceFile.listFiles();
        if (files==null){
            return;
        }
        for (File file:files){
//            System.out.println(sourceFile.getCanonicalFile());
//            System.out.println(file.getCanonicalFile());
//            System.out.println(targetFile.getCanonicalFile());
//            System.out.println("===============================");
            String sourcePath=sourceFile.getCanonicalPath();
            String filePath= file.getCanonicalPath();
            String targetPath=targetFile.getCanonicalPath();
            //截取出相对路径,拼接到目标路径
            String relativePath=filePath.substring(sourcePath.length());
            String  targetFilePath=targetPath+relativePath;
           File targetFilePath1=new File(targetFilePath);
            if (file.isDirectory()){
                //是目录时，就直接创建目录
                targetFilePath1.mkdir();
                traversal(file);
            } else if (file.isFile()) {
                fileCopy(file,targetFilePath1);
            }
        }
    }

    public static void fileCopy(File sourceFile,File targetFile) throws Exception {

            //准备版数据的桶   桶越大数据搬得越快
            byte[] bucket=new byte[1024];

            //打开两个文件
            int count=0;
            try(InputStream is=new FileInputStream(sourceFile)){
                try(OutputStream os=new FileOutputStream(targetFile)){
                    //将源文件放到目标文件中
                    while (true){
                        int n =is.read(bucket);
                        count+=n;
                        System.out.printf("已经复制了 %d 字节的数据\n",count);
                        if (n==-1){
                            //说明文件全部读完了,就终止循环
                            break;
                        }

                        //将源文件直接写入os中
                        os.write(bucket,0,n);
                    }
                    //冲刷缓存区
                    os.flush();
                }
            }
        }
    }

